<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1、实例属性
        class Person {
            // 实例属性
            age = 18;
            sex = 'male';
            getSex = function() {
                return this.sex;
            }
            constructor(name, sex) {
                this.name = name;
                this.sex = sex;
            }
        }
        const p = new Person('Alex')
            // 2、静态方法：类的方法
        class Person1 {
            constructor(name, sex) {
                    this.name = name;
                    this.sex = sex;
                }
                // 不要这么写，目前只是提案，有兼容性问题
                // static version = '1.0'
                // 推荐写法
            static getVersion() {
                return '1.0'
            }
            speak() {
                console.log('speak');
            }
            static speak() {
                console.log('人类不可以说话');
            }
        }
        const p1 = new Person1('Alex', 18);
        p1.speak();
        Person1.speak();
        // 为什么需要私有属性和方法,一般情况下都是公开的
        class Person2 {
            constructor(name) {
                    this._name = name
                }
                // 获取属性可以通过方法不再直接通过属性获取
            getNamem() {
                return this._name
            }
        }

        const pp = new Person2('Alex')
            // ....共有属性可以被公开修改，可能造成意想不到的错误
            // 模拟私有属性和方法
            // 1、 _开头表示私有
            // 2、将私有的属性和方法移出类
            (function() {
                // 私有属性
                let username = ''
                class Person {
                    constructor(name) {
                        // this.name = name;
                        username = name
                    }
                    getNamem() {
                        return this.username
                    }
                }
                // 把Person暴露出去
                window.Person = Person;
            })()
    </script>
</body>

</html>